﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace PCLLearning.Framework.Models
{
    /// <summary>
    /// https://learn.microsoft.com/zh-cn/windows/win32/api/commdlg/ns-commdlg-openfilenamea
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public class OpenFileName
    {
        /// <summary>
        /// 结构的长度（以字节为单位）
        /// </summary>
        public int structSize = 0;
        /// <summary>
        /// 拥有对话框的窗口的句柄。 此成员可以是任何有效的窗口句柄，如果对话框没有所有者，则该成员可以为 NULL 。
        /// </summary>
        public IntPtr dlgOwner = IntPtr.Zero;
        /// <summary>
        /// 如果在 Flags 成员中设置了OFN_ENABLETEMPLATEHANDLE标志，则 hInstance 是包含对话框模板的内存对象的句柄。
        /// 如果设置了 OFN_ENABLETEMPLATE 标志， 则 hInstance 是包含 由 lpTemplateName 成员命名的对话框模板的模块的句柄。
        /// 如果未设置两个标志，则忽略此成员。
        /// 如果设置了 OFN_EXPLORER 标志，系统会使用指定的模板创建一个对话框，该对话框是默认资源管理器样式对话框的子级。
        /// 如果未设置 OFN_EXPLORER 标志，系统会使用模板创建替换默认对话框的旧样式对话框。
        /// </summary>
        public IntPtr instance = IntPtr.Zero;


        /// <summary>
        /// 包含以 null 结尾的筛选器字符串对的缓冲区。
        /// </summary>
        public String? filter = null;
        // public String lpstrFilter = null;

        /// <summary>
        /// 一个静态缓冲区，其中包含一对以 null 结尾的筛选器字符串，用于保留用户选择的筛选器模式。
        /// </summary>
        public String? customFilter = null;
        // public String lpstrCustomFilter = null;

        /// <summary>
        /// 由 lpstrCustomFilter 标识的缓冲区的大小（以字符为单位）。
        /// 此缓冲区长度应至少为 40 个字符。
        /// 如果 lpstrCustomFilter 为 NULL 或指向 NULL 字符串，则忽略此成员。
        /// </summary>
        public int maxCustFilter = 0;
        // public int nMaxCustFilter = 0;

        /// <summary>
        /// 文件类型控件中当前所选筛选器的索引。
        /// </summary>
        public int filterIndex = 0;
        // public int nFilterIndex = 0;

        /// <summary>
        /// 用于初始化文件名编辑控件的 文件名 。 
        /// </summary>
        public String? file = null;
        // public String lpstrFile = null;

        public int maxFile = 0;
        public String? fileTitle = null;
        public int maxFileTitle = 0;
        public String? initialDir = null;
        public String? title = null;
        public int flags = 0;
        public short fileOffset = 0;
        public short fileExtension = 0;
        public String? defExt = null;
        public IntPtr custData = IntPtr.Zero;
        public IntPtr hook = IntPtr.Zero;
        public String? templateName = null;
        public IntPtr reservedPtr = IntPtr.Zero;
        public int reservedInt = 0;
        public int flagsEx = 0;
    }
}
